package Thread;/*
 *
 *@author:    Xavier
 *@data:      2024 - 01 - 12
 *@time:      14:38
 *
 */


// 线程终止，使用Thread自带的标志位
public class Demo09 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()-> {
            // Thread.currentThread() 就是 t.
            // 但是lambda表达式是在构造t之前就已经定义好的，编译器在看到lambda里面的t就会认为是一个为初始化的对象
            while (!Thread.currentThread().isInterrupted()) {
                //Thread.currentThread() 获取到当前线程的对象，，Thread提供的静态方法
                //isInterrupted 是Thread对象内部提供了一个标志位
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;

                }
            }
        });
        t.start();
        Thread.sleep(3000);

        // 这里是把标志位设置为了true
        t.interrupt();
        //这里如果没有在catch哪里加一个break会一直执行下去
        // 线程在sleep过程中，其他线程调用interrupt方法，就会强制使sleep抛出一个异常，sleep就被立即唤醒了
        // 假设你设定sleep（1000）虽然此处才过去了10ms，没到1000ms，也会被立即唤醒
        // sleep在被唤醒的同时，还会自动清除前面设置的标志位，可以有更多操作如果想让线程结束，直接在catch中加个break

        //操作：
        //1、立即停止                -> 加个break
        //2、执行其他任务，在停止      -> 在catch里面写一些想执行的代码在break
        //3、忽略停止，继续循环        -> 不写break

    }
}
